flag_no_verify: bool,
flag_allow_dirty: bool,
flag_jobs: Option<u32>,
+ flag_dry_run: bool,
}
pub const USAGE: &'static str = "
--allow-dirty Allow publishing with a dirty source directory
--manifest-path PATH Path to the manifest of the package to publish
-j N, --jobs N Number of parallel jobs, defaults to # of CPUs
+ --dry-run Perform all checks without uploading
-v, --verbose ... Use verbose output
-q, --quiet No output printed to stdout
--color WHEN Coloring: auto, always, never
flag_no_verify: no_verify,
flag_allow_dirty: allow_dirty,
flag_jobs: jobs,
+ flag_dry_run: dry_run,
..
} = options;
verify: !no_verify,
allow_dirty: allow_dirty,
jobs: jobs,
+ dry_run: dry_run,
}));
Ok(None)
}
pub verify: bool,
pub allow_dirty: bool,
pub jobs: Option<u32>,
+ pub dry_run: bool,
}
pub fn publish(ws: &Workspace, opts: &PublishOpts) -> CargoResult<()> {
// Upload said tarball to the specified destination
try!(opts.config.shell().status("Uploading", pkg.package_id().to_string()));
- try!(transmit(&pkg, tarball.file(), &mut registry));
+ try!(transmit(opts.config, &pkg, tarball.file(), &mut registry, opts.dry_run));
Ok(())
}
Ok(())
}
-fn transmit(pkg: &Package, tarball: &File, registry: &mut Registry)
- -> CargoResult<()> {
+fn transmit(config: &Config,
+ pkg: &Package,
+ tarball: &File,
+ registry: &mut Registry,
+ dry_run: bool) -> CargoResult<()> {
let deps = pkg.dependencies().iter().map(|dep| {
NewCrateDependency {
optional: dep.is_optional(),
}
None => {}
}
+
+ // Do not upload if performing a dry run
+ if dry_run {
+ try!(config.shell().warn("aborting upload due to dry run"));
+ return Ok(());
+ }
+
registry.publish(&NewCrate {
name: pkg.name().to_string(),
vers: pkg.version().to_string(),
assert_that(p.cargo("publish"),
execs().with_status(101));
}
+
+#[test]
+fn dry_run() {
+ setup();
+
+ let p = project("foo")
+ .file("Cargo.toml", r#"
+ [project]
+ name = "foo"
+ version = "0.0.1"
+ authors = []
+ license = "MIT"
+ description = "foo"
+ "#)
+ .file("src/main.rs", "fn main() {}");
+
+ assert_that(p.cargo_process("publish").arg("--dry-run"),
+ execs().with_status(0).with_stderr(&format!("\
+[UPDATING] registry `{reg}`
+[WARNING] manifest has no documentation, [..]
+[PACKAGING] foo v0.0.1 ({dir})
+[VERIFYING] foo v0.0.1 ({dir})
+[COMPILING] foo v0.0.1 [..]
+[UPLOADING] foo v0.0.1 ({dir})
+[WARNING] aborting upload due to dry run
+",
+ dir = p.url(),
+ reg = registry())));
+
+ // Ensure the API request wasn't actually made
+ assert!(!upload_path().join("api/v1/crates/new").exists());
+}